package com.wyw.function.learning.demo8;

import com.wyw.function.learning.common.Car;
import com.wyw.function.learning.common.Insurance;
import com.wyw.function.learning.common.Person1;

import java.util.Optional;

/**
 * @Title   Optional
 * @Description
 * @Author Mr Wu yewen.wu.china@gmail.com
 * Update History:
 * Author        Time            Content
 */
public class DemoClient20 {

    /**
     * 应用Optional的几种模式
     */
    public static void main(String[] args) {
        // 创建Optional对象    声明一个空的Optional
        Optional<Car> empty = Optional.empty();
        // 依据一个非空值创建Optional
        Car car = new Car();
        Optional<Car> carOptional = Optional.of(car);// car如果是nall，会立刻抛出NullPointerException
        Optional<Car> carOptional1 = Optional.ofNullable(car);// car如果是nall，则carOptional1是一个空对象

        Optional<Person1> person = Optional.empty();
        System.out.println(getCarInsuranceName(person));

    }

    public static String getCarInsuranceName(Optional<Person1> person) {
        // 为什么使用flatMap，因为Car是Optional类型包装起来的，如果是map，那么则是Optional<Optional<Car>>.map这样
        return person.flatMap(Person1::getCar)
                .flatMap(Car::getInsurance)
                .map(Insurance::getName)
                // orElseGet：（orElse的延迟调用版）如果创建默认值耗时费力，可以使用此方法提升性能   或者非常确定某个方法尽在Optional为空的时候才进行调用，使用此方法
                // orElseThrow 当Optional对象为空时抛出一个异常，可以定制抛出的异常类型
                .orElse("Unknown");

    }

    /**
     * 两个Optional对象的集合
     */
//    public static Optional<Insurance> getCarInsuranceName(Optional<Person1> person, Optional<Car> car) {
//        if(person.isPresent() && car.isPresent()) {
//            return Optional.of(findInsurance(person.get(), car.get()));
//        } else {
//            return Optional.empty();
//        }
//    }
//
//    public static Optional<Insurance> getCarInsuranceName(Optional<Person1> person, Optional<Car> car) {
//        return person.flatMap(p-> car.map(c->findInsurance(p, c)));
//    }
//
//    private static Insurance findInsurance(Person1 person, Car car) {
//        Insurance insurance = new Insurance();
//        insurance.setName("test");
//        return insurance;
//    }


}
